;s91.asm
assume cs: codesg, ds: datasg 

datasg segment 
	db 'welcome to masm!' 
    db 02H,02H,24H,71H         ;字符显示的属性值 依次是绿色 绿底红色  白底蓝色
datasg ends

codesg segment 
	start:	
        mov ax,datasg 
		mov ds,ax      ;数据段地址

        mov ax,0B800H  ;在汇编源程序中，数据不能以字母开头，所以要在前面加0。
        mov es,ax     ;显示缓冲区的段地址

		mov bx,0      ;设置db段偏移量
        mov si,1824   ;显示缓冲区偏移量
        mov di,16     ;属性偏移量
		mov cx,4      ;3个字符串循环 因为回车会导致换行 我这用了4个字符
	s:	
        push cx       ;保护cx
        mov cx,16     ;开始循环字符串

    write:
        mov al,[bx]    ;读取字符
		mov es:[si],al ;((es)*16 + si)=(al)写内容
        mov ah,[di]    ;读取字符
        mov es:[si+1],ah  ;写属性
		inc bx 
        add si,2  
		loop write

        mov bx, 0      ;恢复bx从新读取字符串
        inc di
        add si,128    ;换行（128）
        pop cx        ;恢复cx 

        loop s
			
		mov ax, 4c00h 
		int 21h 
codesg ends 
end start